package jp.syuriken.snsw.terenaibot;

import java.util.logging.Level;

/**
 * ポストラッパ。
 * 
 * <p>{@link PostWrapperPool}の処理の都合により、デフォルトコンストラクタを使用します。</p>
 * @author $Author: snswinhaiku.lo@gmail.com $
 */
public abstract class PostWrapper {
	
	/** 設定 */
	protected BotConfiguration botConfiguration;
	

	/**
	 * インスタンスを生成する。
	 * 
	 */
	protected PostWrapper() {
	}
	
	/**
	* ポストを取得する
	* 
	* @param postId ポストID 
	* @return 取得されたポスト。{@link NullPost}に注意。
	*/
	public abstract Post getPost(String postId);
	
	/**
	 * 実際にポストするクラスを取得
	 * 
	 * @return ポストクラス
	 */
	public abstract Object getPostActionClass();
	
	/**
	 * ユーザー名を取得する。ユニークでかつユーザフレンドリーな名前を返すべきです。
	 * 
	 * @return ユーザー名
	 * @throws WrapperException WrapperException。詳細は{@link WrapperException#getCause()}を用いてください。
	 * @throws IllegalStateException ログインしていない？
	 */
	public abstract String getUserName() throws IllegalStateException, WrapperException;
	
	/**
	 * ラッパ名。これは通常クラス名です。パッケージ名を返す必要はありません。
	 * 
	 * @return ラッパ名
	 */
	public abstract String getWrapperName();
	
	/**
	 * 初期化する。
	 * 
	 * @param configuration 設定
	 * @return 初期化済みの{@link PostWrapper}
	 * @throws ConfigurationException 設定が出来なかった
	 */
	public PostWrapper init(BotConfiguration configuration) throws ConfigurationException {
		botConfiguration = configuration;
		return this;
	}
	
	/**
	 * ポストを行う。
	 * 
	 * @param poststr ポストする文字列
	 * @return 常時nullが返ります。
	 */
	public Post post(String poststr) {
		botConfiguration.getLogger().log(Level.FINER, "Post: " + poststr);
		return null;
	}
}
